<?php

#[('共同接口')]
interface db
{
    public function conn();
}

#[('服务端开发 (不知道会被谁调用)')]
class dbmysql implements db
{

    public function conn()
    {
        echo "conn mysql ok";
    }
}

class dbsqlite implements db
{

    public function conn()
    {
        echo "conn dbsqlite ok";
    }
}

#[('简单工厂')]
class Factory
{

    public static function createDb($type)
    {
        if ($type == 'mysql') {
            return new dbmysql();
        } else if ($type == 'sqlite') {
            return new dbsqlite();
        } else {
            throw new Exception("Error db type", 1);
        }
    }
}

# 客户端 现在不知道服务器端有哪些类名了
# 只知道对方开放了一个 Factory::createDb 方法
# 方法允许传递数据库名称
$mysql = Factory::createDb('mysql');
$mysql->conn();

$sqlite = Factory::createDb('sqlite');
$sqlite->conn();

# 如果新增 oracle 类型,怎么办?
# 服务端要修改 Factory 内容 (在 java,c++ 中,修改后还需要再编译)
# 在面向对象法则中, 有一个重要的开闭原则 --- 对于修改是封闭的, 对于扩展是开放的
